package plus.easydo.server.file.store.service.impl;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import plus.easydo.core.exception.ExceptionFactory;
import plus.easydo.server.file.store.dto.FileManagementDto;
import plus.easydo.server.file.store.entity.FileManagement;
import plus.easydo.server.file.store.mapper.FileManagementMapper;
import plus.easydo.server.file.store.qo.FileManagementQo;
import plus.easydo.server.file.store.service.FileManagementService;
import plus.easydo.server.file.store.vo.FileManageVo;
import plus.easydo.starter.file.FileResult;
import plus.easydo.starter.file.minio.MinioFileStoreServer;
import plus.easydo.utils.ResultConvertUtil;

import java.util.Arrays;
import java.util.List;


/**
 * 文件管理Service业务层处理
 * 
 * @author gebilaoyu
 * @date 2021-11-12 13:47:40
 */
@Service
public class FileManagementServiceImpl extends ServiceImpl<FileManagementMapper, FileManagement> implements FileManagementService
{

    @Autowired
    MinioFileStoreServer minioFileStoreServer;

    /**
     * 查询文件
     * 
     * @param id 文件ID
     * @return 文件
     */
    @Override
    public FileManageVo selectById(Long id) {
        FileManagement fileStore = baseMapper.selectById(id);
        return ResultConvertUtil.convertVo(fileStore, FileManageVo::new);
    }

    /**
     * 分页条件查询文件列表
     * 
     * @param qo 查询条件封装
     * @return 文件
     */
    @Override
    public IPage<FileManageVo> page(FileManagementQo qo) {
        IPage<FileManagement> page = qo.startPage();
        IPage<FileManagement> iPage = baseMapper.selectFileStoreList(page, qo);
        List<FileManageVo> voList = ResultConvertUtil.copyList(iPage.getRecords(), FileManageVo::new);
        IPage<FileManageVo> voPage = new Page<>();
        BeanUtils.copyProperties(iPage,voPage);
        voPage.setRecords(voList);
        return voPage;
    }

    /**
     * 获取所有文件列表
     *
     * @param qo 查询条件封装
     * @return 文件
     */
    @Override
    public List<FileManageVo> list(FileManagementQo qo) {
        List<FileManagement> list = baseMapper.selectList(Wrappers.query());
        return ResultConvertUtil.copyList(list, FileManageVo::new);
    }

    /**
     * 新增文件
     * 
     * @param dto 数据传输对象
     * @return 结果
     */
    @Override
    public int insert(FileManagementDto dto) {
        FileManagement fileStore = FileManagement.builder().build();
        BeanUtils.copyProperties(dto, fileStore);
        fileStore.buildCreateTime();
//        fileStore.setCreateBy(Oauth2Utils.getUserIdString());
        return baseMapper.insert(fileStore);
    }

    /**
     * 修改文件
     * 
     * @param dto 数据传输对象
     * @return 结果
     */
    @Override
    public int update(FileManagementDto dto) {
        FileManagement fileStore = FileManagement.builder().build();
        BeanUtils.copyProperties(dto, fileStore);
        fileStore.buildUpdateTime();
//        fileStore.setUpdateBy(Oauth2Utils.getUserIdString());
        return baseMapper.updateById(fileStore);
    }

    /**
     * 批量删除文件
     * 
     * @param ids 需要删除的文件ID
     * @return 结果
     */
    @Override
    public Boolean deleteByIds(Long[] ids) {
        List<FileManagement> list = listByIds(Arrays.asList(ids));
        list.forEach(file->{
            Long id = file.getId();
            String path = file.getFilePath();
            String name = file.getFileName();
            String groupName = file.getGroupName();
            try {
                minioFileStoreServer.remove(groupName, path + name);
                removeById(id);
            } catch (Exception e) {
                e.printStackTrace();
               throw ExceptionFactory.baseException("删除文件ID为"+id+"时发生异常");
            }
        });
        return true;
    }

    /**
     * 删除文件信息
     * 
     * @param id 文件ID
     * @return 结果
     */
    @Override
    public Boolean deleteById(Long id) {
        return removeById(id);
    }

    @Override
    public FileManageVo saveFileInfo(FileResult<String> fileResult) {
        FileManagement file = FileManagement.builder()
                .fileName(fileResult.getFileName())
                .fileSize(fileResult.getFileSize())
                .filePath(fileResult.getFilePath())
                .groupName(fileResult.getGroupName())
                .createTime(LocalDateTimeUtil.now())
                .build();
        save(file);
        FileManageVo vo = ResultConvertUtil.convertVo(file, FileManageVo::new);
        vo.setUrl(fileResult.getUrl());
        return vo;
    }


}
